分别编译
C++支持C语言中有关分别编译的概念。这种机制可以用于程序组织为一组部分独立的片段。
典型地,我们将描述一个模块的界面的声明放进一个文件里,以文件名表示它的正当使用方式。这样,
namespace Stack // 界面
{
void push(char);
char pop();
}
可能被放入文件stack.h,堆栈的用户将像下面这样包含该文件(这种文件称为头文件):
#include "stack.h" // 获得界面
void f()
{
Stack::push('c');
if(Stack::pop()!='c') error("impossible");
}
为了帮助编译器保证程序的一致性,提供了Stack模块实现的文件也要包含这个文件:
#include "stack.h" // 获得界面
namespace Stack
{
const int max_size = 200;
char v[max_size];
int top = 0;
}
void Stack::push(char c) { /* 检查上溢并压入c */ }
char Stack::pop() { /* 检查下溢并弹出 */ }
用户代码放在第三个文件里,例如位于user.c中。在stack.c和user.c中的代码共享stack.h提供的堆栈界面信息,除此之外这两个文件就是互不相关的,可以分别进行编译。这些程序片段可以用下面的图表示:
分别编译是一切实际程序中都需要考虑的问题。在程序里,不能简单地将所提供的功能,例如Stack,当做模块。严格地说,分别编译的使用并不是语言要考虑的问题,而是关于如何最好地利用特定语言实现的优点的问题。当然,在实践中这个问题是极其重要的。最好的方式就是最大限度地模块化,通过语言特征去逻辑地表示模块化,而后通过能最有效地分别编译的一组文件,物理地利用这种模块化机制。
🔚